#include <QFileDialog>
#include <QStandardPaths>
#include <QSettings>
#include <QStyle>
#include <QApplication>
#include <QFileInfo>
#include <QDir>
#include <QCursor>
#include <QDateTime>
#include <QProgressDialog>
#include <QMessageBox>
#include "functionbutton.h"

FunctionButton::FunctionButton(QWidget *parent)
    : QWidget{parent}
    , m_pLayout{new QGridLayout(this)}
    , m_pBtnOpen{new QPushButton(this)}
    , m_pBtnClear{new QPushButton(this)}
    , m_pBtnRefresh{new QPushButton(this)}
    , m_pBtnExport{new QPushButton(this)}
    , m_pLabelRecent{new QLabel(tr("最近文件:"), this)}
    , m_pComboRecentFiles{new QComboBox(this)}
    , m_fileFilters{tr("DAT Files (*.dat)")}
{
    setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
    
    // 初始化UI和样式
    initUI();
    initButtonStyles();
    
    // 加载最近文件列表
    QSettings settings("华乘电气", "MapTool");
    m_recentFiles = settings.value("recentFiles").toStringList();
    
    // 验证文件是否有效
    validateRecentFiles();
    
    // 更新下拉列表
    updateRecentFilesCombo();
}

FunctionButton::~FunctionButton()
{
    // 保存最近文件列表
    QSettings settings("华乘电气", "MapTool");
    settings.setValue("recentFiles", m_recentFiles);
}

void FunctionButton::initUI()
{
    // 设置按钮文本
    m_pBtnOpen->setText(tr("导入文件"));
    m_pBtnClear->setText(tr("清空"));
    m_pBtnRefresh->setText(tr("刷新"));
    m_pBtnExport->setText(tr("导出"));
    
    // 设置按钮工具提示
    m_pBtnOpen->setToolTip(tr("打开数据文件"));
    m_pBtnClear->setToolTip(tr("清空当前数据"));
    m_pBtnRefresh->setToolTip(tr("刷新显示"));
    m_pBtnExport->setToolTip(tr("导出当前数据"));
    
    // 设置图标（使用系统图标）
    m_pBtnOpen->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogOpenButton));
    m_pBtnClear->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogResetButton));
    m_pBtnRefresh->setIcon(QApplication::style()->standardIcon(QStyle::SP_BrowserReload));
    m_pBtnExport->setIcon(QApplication::style()->standardIcon(QStyle::SP_DialogSaveButton));
    
    // 添加到布局
    m_pLayout->addWidget(m_pBtnOpen, 0, 0);
    m_pLayout->addWidget(m_pBtnClear, 0, 1);
    m_pLayout->addWidget(m_pBtnRefresh, 1, 0);
    m_pLayout->addWidget(m_pBtnExport, 1, 1);
    m_pLayout->addWidget(m_pLabelRecent, 2, 0);
    m_pLayout->addWidget(m_pComboRecentFiles, 2, 1);
    
    // 设置布局属性
    m_pLayout->setSpacing(10);
    m_pLayout->setContentsMargins(10, 10, 10, 10);
    
    // 连接信号和槽
    connect(m_pBtnOpen, &QPushButton::clicked, this, &FunctionButton::onBtnOpenClicked);
    connect(m_pBtnClear, &QPushButton::clicked, this, &FunctionButton::onBtnClearClick);
    connect(m_pBtnRefresh, &QPushButton::clicked, this, &FunctionButton::onBtnRefreshClick);
    connect(m_pBtnExport, &QPushButton::clicked, this, &FunctionButton::onBtnExportClick);
    connect(m_pComboRecentFiles, QOverload<int>::of(&QComboBox::activated), this, &FunctionButton::onRecentFileSelected);
    
    setLayout(m_pLayout);
}

void FunctionButton::initButtonStyles()
{
    // 设置按钮样式
    QString buttonStyle = "QPushButton {"
                          "   background-color: #f0f0f0;"
                          "   border: 1px solid #c0c0c0;"
                          "   border-radius: 4px;"
                          "   padding: 5px;"
                          "   min-width: 80px;"
                          "}"
                          "QPushButton:hover {"
                          "   background-color: #e0e0e0;"
                          "}"
                          "QPushButton:pressed {"
                          "   background-color: #d0d0d0;"
                          "}";
    
    m_pBtnOpen->setStyleSheet(buttonStyle);
    m_pBtnClear->setStyleSheet(buttonStyle);
    m_pBtnRefresh->setStyleSheet(buttonStyle);
    m_pBtnExport->setStyleSheet(buttonStyle);
    
    // 设置下拉框样式
    m_pComboRecentFiles->setStyleSheet("QComboBox {"
                                       "   background-color: #f8f8f8;"
                                       "   border: 1px solid #c0c0c0;"
                                       "   border-radius: 4px;"
                                       "   padding: 3px;"
                                       "}");
}

void FunctionButton::validateRecentFiles()
{
    QStringList validFiles;
    
    for (const QString& filePath : m_recentFiles) {
        QFileInfo fileInfo(filePath);
        if (fileInfo.exists() && fileInfo.isReadable()) {
            validFiles.append(filePath);
        }
    }
    
    // 更新为有效的文件列表
    m_recentFiles = validFiles;
}

void FunctionButton::updateRecentFilesCombo()
{
    m_pComboRecentFiles->clear();
    
    if (m_recentFiles.isEmpty()) {
        m_pComboRecentFiles->addItem(tr("(无最近文件)"));
        m_pComboRecentFiles->setEnabled(false);
    } else {
        m_pComboRecentFiles->setEnabled(true);
        for (const QString& filePath : m_recentFiles) {
            QFileInfo fileInfo(filePath);
            QString displayText = fileInfo.fileName();
            
            // 添加最后修改日期
            QString modifyDate = fileInfo.lastModified().toString("yyyy-MM-dd");
            displayText = QString("%1 (%2)").arg(displayText).arg(modifyDate);
            
            m_pComboRecentFiles->addItem(displayText, filePath);
        }
    }
}

void FunctionButton::onBtnOpenClicked()
{
    // 获取默认打开目录
    QString defaultDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
    if (!m_recentFiles.isEmpty()) {
        QFileInfo fileInfo(m_recentFiles.first());
        if (fileInfo.exists()) {
            defaultDir = fileInfo.absolutePath();
        }
    }
    
    // 打开文件对话框
    QString filePath = QFileDialog::getOpenFileName(this, tr("选择文件"), defaultDir, m_fileFilters);
    if (!filePath.isEmpty()) {
        QFileInfo fileInfo(filePath);
        if (!fileInfo.exists() || !fileInfo.isReadable()) {
            QMessageBox::warning(this, tr("文件错误"), tr("所选文件不存在或无法读取。"));
            return;
        }

        // 显示加载进度对话框
        QProgressDialog progress(tr("正在加载文件..."), tr("取消"), 0, 100, this);
        progress.setWindowModality(Qt::WindowModal);
        progress.setCursor(Qt::WaitCursor);
        progress.setMinimumDuration(0);
        progress.setValue(10);
        
        // 添加到最近文件列表
        addRecentFile(filePath);
        
        progress.setValue(50);
        
        // 发送文件选择信号
        emit sigFileSelected(filePath);
        
        progress.setValue(100);
    }
}

void FunctionButton::onBtnClearClick()
{
    // 创建进度对话框
    QProgressDialog progress(tr("正在清除数据..."), tr("取消"), 0, 100, this);
    progress.setWindowModality(Qt::WindowModal);
    progress.setCursor(Qt::WaitCursor);
    progress.setMinimumDuration(0);
    progress.setValue(20);
    
    // 发送清空信号
    emit sigClearAll();
    
    progress.setValue(100);
}

void FunctionButton::onBtnRefreshClick()
{
    // 发送刷新信号
    emit sigRefresh();
}

void FunctionButton::onBtnExportClick()
{
    // 创建进度对话框
    QProgressDialog progress(tr("正在准备导出..."), tr("取消"), 0, 100, this);
    progress.setWindowModality(Qt::WindowModal);
    progress.setCursor(Qt::WaitCursor);
    progress.setMinimumDuration(0);
    progress.setValue(5);
    
    // 发送导出信号
    emit sigExport();
    
    progress.setValue(10);
}

void FunctionButton::onRecentFileSelected(int index)
{
    if (index >= 0 && index < m_recentFiles.size()) {
        QString filePath = m_recentFiles.at(index);
        
        // 检查文件是否存在且可读
        QFileInfo fileInfo(filePath);
        if (!fileInfo.exists() || !fileInfo.isReadable()) {
            QMessageBox::warning(this, tr("文件错误"), 
                                tr("文件 %1 不存在或无法读取。").arg(fileInfo.fileName()));
            
            // 从列表中移除无效文件
            m_recentFiles.removeAt(index);
            updateRecentFilesCombo();
            return;
        }
        
        // 显示加载进度对话框
        QProgressDialog progress(tr("正在加载文件..."), tr("取消"), 0, 100, this);
        progress.setWindowModality(Qt::WindowModal);
        progress.setCursor(Qt::WaitCursor);
        progress.setMinimumDuration(0);
        progress.setValue(10);
        
        // 更新最近文件列表顺序（将选中的文件移到最前）
        addRecentFile(filePath);
        
        progress.setValue(50);
        
        // 发送最近文件选择信号
        emit sigRecentFileSelected(filePath);
        
        progress.setValue(100);
    }
}

void FunctionButton::setButtonsEnabled(bool enabled)
{
    m_pBtnOpen->setEnabled(enabled);
    m_pBtnClear->setEnabled(enabled);
    m_pBtnRefresh->setEnabled(enabled);
    m_pBtnExport->setEnabled(enabled);
    m_pComboRecentFiles->setEnabled(enabled && !m_recentFiles.isEmpty());
}

void FunctionButton::enableOpenButton(bool enabled)
{
    // 单独设置打开按钮的状态
    m_pBtnOpen->setEnabled(enabled);
    m_pComboRecentFiles->setEnabled(enabled && !m_recentFiles.isEmpty());
}

void FunctionButton::setFileFilters(const QString& filters)
{
    m_fileFilters = filters;
}

QStringList FunctionButton::getRecentFiles() const
{
    return m_recentFiles;
}

void FunctionButton::addRecentFile(const QString& filePath)
{
    // 如果文件已在列表中，则移除
    m_recentFiles.removeAll(filePath);
    
    // 添加到列表头部
    m_recentFiles.prepend(filePath);
    
    // 限制最近文件数量
    while (m_recentFiles.size() > MAX_RECENT_FILES) {
        m_recentFiles.removeLast();
    }
    
    // 更新下拉框
    updateRecentFilesCombo();
}
